Java集合详解(List、Map、Set)

您所在的位置:网站首页 java map父类 Java集合详解(List、Map、Set)

Java集合详解(List、Map、Set)

2024-05-22 19:17| 来源: 网络整理| 查看: 265

集合单列集合双列集合

集合分为单列集合和双列集合

单列集合分为list,set;双列集合就是map;

我们常用的是ArrayList和HashMap

list分为ArrayList和LinkedList;set分为HashSet和TreeSet;map分为hashmap和treemap;ArrayList

ArrayList底层是数组,默认长度为0;当添加第一个元素时,长度变为10,扩容机制是当数组存满时,还要继续添加元素,就会创建一个新的数组,容量是之前数组的1.5倍,并把之前元素复制进新数组。

HashMap

HashMap1.7之前底层是数组+链表,1.8之后是数组+链表+红黑树,底层重写了hashcode和equals方法,先计算hash值,hash值会根据hash函数计算出索引值,存入指定位置,如果位置上没有,存入,如果有比较equals,如果相同,新值替换旧值,如果不同,就挂下面,链表长度大于等于8,转为红黑树,小于等于6,转成链表。扩容机制,默认是16,加载因子0.75,每次长度乘2。

HashMap的主干是一个Entry数组。 Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。 Entry是hashmap中的静态内部类

代码语言:javascript复制HashMap中关键属性 transient Entry[] table; // 存储元素的实体数组 transient int size;// 存放元素的个数 int threshold; // 临界值 当实际大小超过临界值时,会进行扩容threshold = 加载因子*容量 final float loadFactor; // 加载因子 transient int modCount;// 被修改的次数HashTable

HashTable和concurrenthashmap线程安全,hashtable所有的方法都是synchronized修饰的 concurrenthashmap1.7之后是CAS+synchronized,所以是线程安全的。

解决hash冲突的方法

hash碰撞冲突:hashCode()的方法是为了产生不同的hash值,但是当两个对象的hash一样时,就发生了碰撞冲突

我们常用的解决方法有四种:

开放地址法再hash法拉链法建立公共溢出区开放地址法

开放地址法: 基本思想:当发生地址冲突的时候,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止 所用公式 Hi(key) = [H(key) + di]mod m;其中i = 1、2、3…k(k



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3